package state;

/**
 * 1. interface 和 abstract class 有什么区别
 *      interface
 *          1 接口只能有声明方法, 做不了实现
 *          2 成员变量只能是 public static final(隐式声明),且必须在声明时赋值
 *          3 一个类可以实现多个接口
 *
 *      abstract class
 *          1 抽象类可以实现方法
 *          2 成员变量的声明,实现不受限制
 *          3 一个类只能继承一个类,不管是不是抽象类
 *
 * 2. 跟 策略模式 有什么区别
 *      类图其实都是一模一样的, 一个 Context 上下文, Stratege/State 父类(接口), 各种子类
 *      目前认为, 两者除了在意义上不一样, 代码实现等方面是可以一模一样的.
 *
 * 3. 优缺点
 *      来自以下链接内容: https://baijiahao.baidu.com/s?id=1644897607922797227&wfr=spider&for=pc
 *      优点:
 *      1：对状态转换规则进行了封装；
 *      2：可以使用枚举类，枚举出所有可能的状态。但是需要在枚举状态之前确定状态的种类；
 *      3：扩展性好。将所有与某个或者某些状态有关的行为放到了一个类对象中，这样方便管理，并且可以方便的新增状态，只需要改变对象状态就可以实现改变对象行为了；
 *      4：代码简洁好维护。状态模式允许状态转换逻辑和状态对象合为一体，而不是一个巨大的条件语句块；
 *      5：可以让多个不同的环境对象共享一个状态的对象，这样减少系统中对象的数量。
 *
 *      缺点:
 *      1：增加对象和系统类的个数；
 *      2：结构与实现比较复杂，如果使用不当，可能会造成程序结构和代码给人感觉很混乱的；
 *
 * 5：可以让多个不同的环境对象共享一个状态的对象，这样减少系统中对象的数量。
 *
 *
 * 4. 自己的话来介绍一下
 *      其实这个可以说是非常常用的设计模式, 例如我们设计不同的登陆状态时看视频的行为也会有所差异
 */
public class StatePattern {
    public static void main(String[] args) {
        Context zhangSan = new Context();
        zhangSan.changeState(new Happy());
        zhangSan.doSomething();
        zhangSan.changeState(new Angry());
        zhangSan.doSomething();
        zhangSan.changeState(new Sad());
        zhangSan.doSomething();
    }
}

interface State {
    void doWork();
}

class Happy implements State {
    @Override
    public void doWork(){
        System.out.println("积极主动!");
    }
}

class Angry implements State {
    @Override
    public void doWork(){
        System.out.println("啥也不干!");
    }
}

class Sad implements State {
    @Override
    public void doWork(){
        System.out.println("无精打采!");
    }
}

class Context {
    private State state;
    public void changeState(State state) {
        this.state = state;
    }
    public void doSomething(){
        state.doWork();
    }
}